package JVM;

/**
 * @Author: cjj
 * JVM是一个抽象的计算模型和运行时环境。它将java字节码(.class文件)解释或编译为机器代码,并提供内存管理
 * 垃圾回收和线程管理等功能。是Java语言"一次编译",到处运行理念的核心实现。
 *
 * jvm由Java规范定义,但具体实现由不同的供应商提供。JVM规范是标准化的蓝图,不同厂商的实现在遵循规范的前提下,会有差异。
 *
 */
public class jvm {
    /**
     * 功能：
     * 1.加载和执行字节码：
     *   JVM将Java编译器生成的字节码加载到内存中,并逐行解释或编译执行。
     * 2.内存管理：
     *   JVM管理应用程序的内存,包括堆(Heap),栈(Stack),方法区(Method Area)等,负责对象的分配与回收
     *3.垃圾回收:
     *   自动回收无用对象的内存,减少内存泄露的风险
     *4.提供运行时环境:
     *    JVM提供线程管理,异常处理,安全性检查等功能。
     *  跨平台：Java的一次编写,到处运行,得益于JVM的实现。不同平台有各自的JVM实现。但字节码标准统一。
     */


    /**
     * JVM内存结构
     * JVM的内存结构是其运行Java程序时管理和分配内存的重要组成部分。它将内存划分为多个区域,每个区域都有特定的用途,
     * 主要用于存储类信息,对象实例,方法执行时的数据以及线程相关信息等。
     *
     * Java虚拟机规范,JVM的运行时内存结构包括：
     *  程序计数器：线程独立 用于记录当前线程执行的字节码指令地址
     *  虚拟机栈(JVM Stack): 线程独立 存储方法调用的局部变量,操作数栈,动态链接和方法返回信息。
     *  本地方法栈：线程独立 与JVM栈类似,但用于执行本地方法(如JNI调用)。
     *  堆(Heap)线程共享：存储所有对象实现和数组,是GC(垃圾回收)的主要管理区域
     *  方法区(Method Area) 线程共享：存储类信息,常量池,静态变量,即时编译(JIT)后的代码等元数据信息
     *  (在Java8之前称为"永久代")。
     *  运行时常量池:线程共享 方法区的一部分(java8之前),存储类和方法的符号引及编译期生成的常量。
     *  1.程序计数器： java源码通过编译器.class字节码文件,其中包含JVM指令,操作系统无法直接运行。当运行程序
     *  时,JVM将字节码加载到内存中,通过解释器逐条将JVM指令解释为机器码执行,或者通过即时编译器将热点代码直接编译
     *  为本地机器以及提高性能。
     *
     *   java支持多线程运行,线程之间通过时间片轮转实现交替执行。
     *   程序计数器是一块较小的内存空间,记录当前线程正在执行的JVM指令的偏移量,确保线程切换后可以恢复到原来的正确的
     *   执行位置。程序计数器各条线程之间计数器互不影响,独立存储。
     *
     *   特点：
     *    1.每个线程都有独立的程序计数器
     *    2.程序计数器不存在内存溢出
     *
     *   2.虚拟机栈
     *     虚拟机栈(JVM Stack)是Java虚拟机为每个线程分配的私有内存空间, 每个方法在调用时会创建一个栈帧,然后加入到
     *     虚拟机栈中,其中栈帧储存着方法局部变量表,操作数栈,动态链接和返回地址。(生命周期和线程相同,线程结束时会自动
     *     释放对应的内存。)
     *     1.栈中变量：
     *        对于栈中基本数据类型的变量,会直接存储在栈内存中,而不是引用
     *        对于栈中引用数据类型的变量,栈内存存储的对象的引用地址,而对象的实际内容存储在堆内存中
     *     2.栈和栈顶的关系:
     *        当调用方法1(栈帧1)时,栈帧进栈,栈帧1中调用了方法2(栈帧2),栈帧2进栈,当方法2执行完后，栈帧2出战，栈帧1出栈
     */

    /**
     * 3.本地方法栈
     *   本地方法栈是JVM的运行时区域之一,用于支持本地方法的执行。遵循 线程私有,按调用顺序管理栈帧的规则,同样存储方法的局部变量表,操作
     *   数栈,动态链接和返回地址,可调整栈内存大小。
     * 4.堆
     *   堆是JVM中最重要的内存区域之一,用于存储所有对象实例和数组。它是被线程共享的内存区域,堆内存受到垃圾回收器管理。
     *   将虚拟机堆内存划分为不同的区域,如新生代,老年代,eden等只是设计风格而已,并不是所有的Java虚拟机都有的固定堆内存布局。像上面讲到的新生代
     *   老年代等,"经典分代" 设计是HotSpot虚拟机的部分垃圾收集器按照这个划分来工作。
     */

    /**
     * 5.方法区
     *   方法区是各个线程共享的一块逻辑内存区域,它用于存储已经被虚拟机加载的类型信息,常量,静态变量,即使编译器编译后的代码缓存等数据。
     *   方法区的实现在Java8的HotSpot虚拟机采用的是元空间(元空间在本地内存)。
     *   在Java8之前,HotSpot虚拟机使用的是永久代(永久代在JVM中已经不存在了)。
     *
     * 6.运行时常量池
     *    线程共享方法区的一部分存储类和方法的符号引用及编译期生成的常量。
     *
     *
     */
}
